/**
******************************************************************************************
* @file MessageHandler.c
* @brief Redirect TCP/IP message at the good place with the aid of pattern command.
* @date 8 avril 2015
* @author Benjamin Lancinot
*****************************************************************************************/
/* COPYRIGHT ****************************************************************************
*****************************************************************************************
* Copyright (c) 2015, Audrey LOISEAU and Benjamin LANCINOT.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
*    list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
*    this list of conditions and the following disclaimer in the documentation
*    and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
********************************************************************************************/

#include "MessageHandler.h"

/*******************************************************************************************
* PROTOYPES
********************************************************************************************/

void MessageHandler_destroy(MessageHandler **);

void MsgHandler_handle(MessageHandler*, unsigned char , char *);

/*******************************************************************************************
 * FUNCTIONS
 ********************************************************************************************/

/**
 * @brief Constructor
 * @param commandTab Pointer to all of the commands
 * @param cmdTabSize Number of commands
 * @return Pointer to a new MessageHandler
 **/
MessageHandler* MessageHandler_create(Command* commandTab[], int cmdTabSize){
        MessageHandler* This = (MessageHandler *) malloc(sizeof(*This));
        int i=0;
        //Init functions
        This->handle = MsgHandler_handle;
	This->destroy = MessageHandler_destroy;
        This->numberOfCommand = cmdTabSize;

        //cration of commands
        for (i=0 ; i<cmdTabSize ; i++){
		This->cmd[i] = commandTab[i];
        }
	return This;
}

/**
 * @brief Destructor
 * @param This Double pointer to the wanted MessageHandler
 **/
 void MessageHandler_destroy(MessageHandler **This){

	 if (*This) {
		 free(*This);
		 *This = NULL;
	 }
}


/**
 * @brief Perform the execution of the right command. The argument value is passed.
 * @param This Pointer to the wanted MessageHandler
 * @param id Id of the right command
 * @param value Char sequence with argument value
 **/
void MsgHandler_handle(MessageHandler* This, unsigned char id, char *value){

	if(id < This->numberOfCommand){
		This->cmd[id]->execute(This->cmd[id],value);
	}
}
